#!/bin/bash
# usage: 



# =============================== <打包成docker镜像并推送到harbor仓库> ===========================
# ------------------------------------变量定义---------------------------------------
# 手动定义变量
# 暂无
# 自动生成的变量
# 镜像环境，在harbor里作为表示为项目
if [ "$IP_LAN1" = "192.168.101.29" ];
then
	iamge_env="dev-env"
    registry_url="harbor.lovego2016.com"
fi
# 镜像名
image_name="$(ls $WORKSPACE/target | egrep *.jar$ | awk -F'.' '{print $1}')"
# git版本号，和下面一起用作镜像的tag名
git_revision=$(git show --oneline | head -n 1 | awk '{print $1}')
version_1="v$(date +%Y%m%d_%H%M%S)_${git_revision}"
version_2="latest"
# 镜像完整名（加上仓库和在仓库的项目）
image_url="$registry_url/$iamge_env/$image_name"
image_url_v1="$image_url:$version_1"
image_url_v2="$image_url:$version_2"



# ----------------------------------构建docker镜像-------------------------------------
# 进入工作目录
cd $WORKSPACE

# 替换文件内的变量
sed -i "s/VAR_IMAGE_NAME/$image_name/g" src/main/docker/Dockerfile
# 更新 FROM 字段后面的镜像，如果不更新的话，由于tag一样，会取本地缓存
docker pull harbor.lovego2016.com/base/centos7-jdk8:latest
# 构建镜像并打tag
docker build -t $image_url_v1 -f src/main/docker/Dockerfile .
# 打最新的tag
docker tag $image_url_v1 $image_url_v2
# 推送镜像到仓库
docker push $image_url_v1
docker push $image_url_v2


# 如果出现登陆异常,请手动执行登陆
# docker login -u admin -p Harbor12345 harbor.test.com


# --------------------------------清理本地jenkins历史tag----------------------------------
# 只保留latest及v开头最新的5个，一共6个
# 如果不足6个的话，会失败，所以仅在大于6个的时候才删除
image_tag_num=$(docker images | grep $image_url | wc -l)
if [ $image_tag_num -gt 6 ];
then
	docker rmi $(docker images | grep $image_url | grep -v latest | sort -k2 -rn | sed '1,5 d' | awk '{print $3}')
fi
# 注：对于一个服务，即使一模一样的git版本，所生成的镜像的id也不一样






# ======================== <发布到Kubernetes集群内部，若已发布，则更新版本> =========================
# --------------------------------发布到Kubernetes----------------------------------
# 前置条件1
# 需要自动为jenkins配置Kubernetes的kubectl管理
# kubectl config view
# kubectl get nodes
# 前置条件2
# 需要在rancher上面，保存一个具有harbor管理员权限的账户，不然kubernetes在创建deployment拉取不下来镜像
# 

# 手动定义的变量
# 暂无
# 自动生成的变量
# 发布环境，是git源码里面的目录名
if [ "$IP_LAN1" = "192.168.101.29" ];
then
	k8s_env="devb"
fi
# 镜像名
image_name="$(ls $WORKSPACE/target | egrep *.jar$ | awk -F'.' '{print $1}')"
deployment_name="deploy-$image_name"
service_name="svc-$image_name"
#container_name="container-$image_name"

# 替换文件内的变量
sed -i "s/VAR_IMAGE_NAME/$image_name/g" src/main/kubernetes/$k8s_env/deployment.yml
sed -i "s/VAR_IMAGE_NAME/$image_name/g" src/main/kubernetes/$k8s_env/service.yml

if [ "$(kubectl get deployments $deployment_name)" ]
then
	deployment_exist=1
	# 如果Deployment已存在，则自动从部署文件更新配置（含版本）
    # kubectl set image deployment/$deployment_name $container_name=$image_url_v1
    # apply更新的方式更为完善
    kubectl apply -f src/main/kubernetes/$k8s_env/deployment.yml --record
else
	deployment_exist=0
    # 如果Deployment不存在，则创建deployment
	kubectl create -f src/main/kubernetes/$k8s_env/deployment.yml --record
fi
# echo $deployment_exist

if [ "$(kubectl get services $service_name)" ]
then
	service_exist=1
    # 如果sercice已存在，则自动从部署文件更新配置
    kubectl apply -f src/main/kubernetes/$k8s_env/service.yml --record
else
	service_exist=0
    # 如果sercice不存在，则创建
    kubectl create -f src/main/kubernetes/$k8s_env/service.yml --record
fi
# echo $service_exist











